#ifndef LOGGER_H
#define LOGGER_H

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <iomanip>
#include <mutex>
#include <sstream>

// 日志级别
enum class LogLevel {
    DEBUG_LEVEL,  // 调试信息
    INFO,         // 一般信息
    WARNING,      // 警告信息
    ERROR,        // 错误信息
    FATAL         // 致命错误
};

// 日志类
class Logger {
public:
    /**
     * 获取单例实例
     * @return 日志单例
     */
    static Logger& getInstance();
    
    /**
     * 设置日志级别
     * @param level 日志级别
     */
    void setLevel(LogLevel level);
    
    /**
     * 写入日志
     * @param level 日志级别
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void log(LogLevel level, const std::string& message, const char* file = "", int line = 0);
    
    /**
     * 写入调试日志
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void debug(const std::string& message, const char* file = "", int line = 0);
    
    /**
     * 写入信息日志
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void info(const std::string& message, const char* file = "", int line = 0);
    
    /**
     * 写入警告日志
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void warning(const std::string& message, const char* file = "", int line = 0);
    
    /**
     * 写入错误日志
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void error(const std::string& message, const char* file = "", int line = 0);
    
    /**
     * 写入致命错误日志
     * @param message 日志消息
     * @param file 源文件
     * @param line 行号
     */
    void fatal(const std::string& message, const char* file = "", int line = 0);

    /**
     * 设置日志文件
     * @param filename 日志文件名
     * @return 是否成功
     */
    bool setLogToFile(const std::string& filename);

private:
    // 构造函数
    Logger();
    
    // 析构函数
    ~Logger();
    
    // 将日志级别转换为字符串
    std::string levelToString(LogLevel level);
    
    // 日志级别
    LogLevel m_level;
    
    // 禁止拷贝和赋值
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    bool m_logToFile;
    std::ofstream m_logFile;
    std::mutex m_mutex;
};

// 宏定义，方便使用
#define LOG_DEBUG(message) Logger::getInstance().debug(message, __FILE__, __LINE__)
#define LOG_INFO(message) Logger::getInstance().info(message, __FILE__, __LINE__)
#define LOG_WARNING(message) Logger::getInstance().warning(message, __FILE__, __LINE__)
#define LOG_ERROR(message) Logger::getInstance().error(message, __FILE__, __LINE__)
#define LOG_FATAL(message) Logger::getInstance().fatal(message, __FILE__, __LINE__)

#endif // LOGGER_H 